各位鄉親父老兄弟姊妹,打給厚!
由於我是超級菜逼八,各位大神大佬不想浪費時間的話可以左轉出門了,謝謝~
但若您願意留下來為我指正錯誤,小的我...不好意思,沒什麼拿得上檯面的東西,我只能感激涕零的向您道謝! > <
Pwn 在資安領域中是表示成功入侵對方系統,獲得主控權。
通常,達成 Pwn 的方式是藉由一些程式漏洞,導致使用者可以下惡意的精心設計過的字串(payload),獲得任意操作系統的權限。
這些程式漏洞有很多種類,舉其中有一個蠻有名的例子,這漏洞稱為 buffer overflow。所謂的 buffer 就是記憶體的一塊固定大小的區塊區塊,用來讓程式暫存資料,大小可以自己分配,例如:
char buf[0x10];
代表我們配置了一個大小為 0x10 ( 16 bytes ) 的一塊(記憶體)空間來存放資料,那麼若是將內容塞入 buffer 時沒有做好邊界檢查,讓輸入的內容大於 buffer 的大小,那我們傳進去的東西就會超出(overflow)原先配置的那塊記憶體位置,繼續往下存入記憶體,往下存入的內容將會把原先放在那邊的值覆蓋掉。想想看,如果這時候我們覆蓋掉的位置剛好是被認定為存放某條指令的位置,那這就會導致程式崩潰,例如:
┌──(kali㉿kali)-[/mnt/…/CTF/pwn]
└─$ ./hello
Enter your name: AuTong
Hello AuTong
┌──(kali㉿kali)-[/mnt/…/CTF/pwn]
└─$ ./hello
Enter your name: AuTooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
zsh: segmentation fault ./hello
第二次執行直接 crash 掉了,然而若我們將覆蓋的值做精心設計,讓他剛好是我們想執行的記憶體位置,這時我們將可以取得主控權。
那麼我麼該如何找到應該要在哪個位置覆蓋,以及該覆蓋什麼呢?
要知道這個必須要了解程式的運作方式與記憶體的配方式。
當我們用 C 語言寫好一隻 .c 檔後,我們會使用 GCC 等編譯器將我們寫好的程式碼轉成可執行文件,可執行文件有不同的格式,在 Linux 底下是 ELF 格式,在 Windows 底下是 PE 格式。本篇的環境是在 WSL 底下,因此是使用 ELF 格式。
註:編譯器將 .c 檔轉為可執行檔的過程如下:
- 前處理 (Preprocess):前處理器會到特定目錄底下搜尋對應到的函式庫並將 #include 部份展開,加入到 .c 檔
- 編譯(Compile):將人可看懂的高階語言轉成組合語言
- 組譯(Assmble):將組合語言轉為機器語言,這時候出來的檔通常稱為目的檔(.o),這時候所有的 symbol 都還沒被定位
- 連結(Link):就是將一些動態鏈結函式庫等等的東西跟 .o 組合在一起,變成一分可執行文件
而所謂的 ELF 格式...
我發現,我已經超過最低字數三倍了,所以雖然他沒頭沒尾的,但我還是要斷在這裡www
原本預計 basic 只會有(3)現在看起來會到(7)了www
感謝大家看完以上的廢話,現在終於要進入正文了~
五侯雜燴,又稱為五侯鯖。
主要是肉加魚的雜燴,相傳是最早已雜燴手法製作的料理。
今天沒有歷史故事了,直接上圖
謝謝大家~
source:教育部重編國語辭典